#include <iostream>
using namespace std;

class Parent
{
public:
	Parent(int a=0)
	{
		this->a=a;
	}
	
	virtual void printf()//手脚1：virtual定义。放在虚函数表里。
	{
		cout<<"Parent\n"<<endl;
	}
 private:
    int a;
	
};


class Child : public Parent
{
public:
	Child(int a=0,int b=0)
	{
		this->a=a;
		this->b=b;
	}
	
	virtual void printf()
	{
		cout<<"Child\n"<<endl;
	}
 private:
    int a;
    int b;
};

void HowToPrint(Parent* p)
{
	p->printf();//手脚3：传来子类对象，执行子类的printf，传来父类对象，执行父类的printf。c++编译器根本不需要区分是子类对象还是父类对象，只判断printf是不是虚函数，若是虚函数通过对象的vptr指针，找到虚函数表，找到函数入口地址。动态联编。
}

int main()
{
	Parent p;//手脚2：提前布局：创建对象的时候。c++会在对象中加一个vptr指针，为对象中virtual修饰的成员函数创建虚函数表
	Child c;//子类也有vptr指针。
    HowToPrint(&p);
    HowToPrint(&c);
	return 0;
}
